package com.mall.common.model;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Getter;
import com.github.pagehelper.Page;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 通用分页结果封装
 *
 * @param <T> 数据类型
 */
@Getter
@JsonInclude(JsonInclude.Include.NON_NULL)
public class PageResult<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    // ================== Getter/Setter ==================
    // ================== 分页元数据 ==================
    private Long total;         // 总记录数
    private Integer pageNum;    // 当前页码 (1-based)
    private Integer pageSize;   // 每页记录数
    private Integer pages;      // 总页数
    private Boolean hasNextPage; // 是否有下一页 (可省略，通过计算得出)

    // ================== 分页数据 ==================
    private List<T> list;      // 当前页数据列表

    // ================== 构造方法 ==================
    public PageResult() {}

    public PageResult(List<T> list, Long total, Integer pageNum, Integer pageSize) {
        this.list = list;
        this.total = total;
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.pages = (int) Math.ceil(total.doubleValue() / pageSize);
        this.hasNextPage = pageNum < this.pages;
    }
    // ================== 新增静态方法 ==================
    /**
     * 将PageHelper分页后的list转为PageResult
     * @param list PageHelper分页查询结果（必须是com.github.pagehelper.Page类型）
     * @return 分页结果对象
     */
    public static <T> PageResult<T> restPage(List<T> list) {
        if (list instanceof Page) {
            Page<T> page = (Page<T>) list;
            return new PageResult<>(
                page.getResult(), // 当前页数据
                page.getTotal(),  // 总记录数
                page.getPageNum(), // 当前页码
                page.getPageSize() // 每页条数
            );
        }
        // 兼容非分页查询返回普通List的情况（按单页处理）
        return new PageResult<>(
            list,
            (long) list.size(),
            1,
            list.size()
        );
    }

    // ================== 静态工厂方法 ==================
    /**
     * 创建分页结果
     */
    public static <T> PageResult<T> of(List<T> list, Long total, Integer pageNum, Integer pageSize) {
        return new PageResult<>(list, total, pageNum, pageSize);
    }

    /**
     * 创建空分页结果
     */
    public static <T> PageResult<T> empty(Integer pageNum, Integer pageSize) {
        return new PageResult<>(Collections.emptyList(), 0L, pageNum, pageSize);
    }

    /**
     * 转换数据模型
     * @param mapper 数据转换函数
     * @return 新类型的PageResult
     */
    public <R> PageResult<R> map(Function<T, R> mapper) {
        List<R> mappedList = list.stream()
            .map(mapper)
            .collect(Collectors.toList());
        return new PageResult<>(mappedList, total, pageNum, pageSize);
    }

    public void setTotal(Long total) {
        this.total = total;
        // 重新计算相关值
        calculateDerivedFields();
    }

    public void setPageNum(Integer pageNum) {
        this.pageNum = pageNum;
        calculateDerivedFields();
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
        calculateDerivedFields();
    }

    public void setList(List<T> list) {
        this.list = list;
    }

    // ================== 辅助方法 ==================
    private void calculateDerivedFields() {
        if (total != null && pageSize != null && pageSize > 0) {
            this.pages = (int) Math.ceil((double) total / pageSize);
            this.hasNextPage = pageNum != null && pageNum < pages;
        }
    }

    /**
     * 获取从0开始的页码（用于MyBatis等框架）
     */
    public Integer getOffset() {
        if (pageNum == null || pageSize == null || pageNum <= 1) return 0;
        return (pageNum - 1) * pageSize;
    }

    /**
     * 判断是否为空
     */
    public boolean isEmpty() {
        return list == null || list.isEmpty();
    }
}
